#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <sw/redis++/redis++.h>
#include <chrono>
#include <thread>
#include "util.hpp"

using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::unordered_map;

//get 和 set
void test1(sw::redis::Redis& redis)
{
    cout << "get 和 set 的使用" << endl;
    //清空一下数据库，避免之前残留的数据有干扰
    redis.flushall();
    //使用 set 设置 key
    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");

    //使用 get 获取到 key 对应的 value
    //optional 可以隐式类型转化成 bool 类型
    auto value1 = redis.get("key1");
    if(value1)
    {
        cout << "value1=" << value1.value() << endl;
    }
    auto value2 = redis.get("key2");
    cout << "value2=" << value2.value() << endl;
    auto value3 = redis.get("key3");
    cout << "value3=" << value3.value() << endl;
    
    auto value4 = redis.get("key4");
    if(value4)
    {
        cout << "value4=" << value4.value() << endl;
    }
}

//exists
void test2(sw::redis::Redis& redis)
{
    cout << "exists 的使用" << endl;
    //清空一下数据库，避免之前残留的数据有干扰
    redis.flushall();

    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");


    auto ret = redis.exists("key1");
    std::cout << ret << std::endl;

    auto no_ret = redis.exists("no_key");
    std::cout << no_ret << std::endl;

    auto rets = redis.exists({"key1", "key2", "key3", "key4"});
    std::cout << rets << std::endl;

}

//del
void test3(sw::redis::Redis& redis)
{
    cout << "del 的使用" << endl;
    //清空一下数据库，避免之前残留的数据有干扰
    redis.flushall();
    redis.set("key1", "111");
    redis.set("key2", "222");

    auto exist_b = redis.exists("key1"); 
    std::cout << exist_b << std::endl;

    auto ret = redis.del("key1");
    std::cout << ret << std::endl;

    auto rets = redis.del({"key1", "key2", "key3"});
    std::cout << rets << std::endl;

    auto exist_e = redis.exists("key1"); 
    std::cout << exist_e << std::endl;

}

//keys
void test4(sw::redis::Redis& redis)
{
    cout << "keys 的使用" << endl;
    //清空一下数据库，避免之前残留的数据有干扰
    redis.flushall();
    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");    
    redis.set("key4", "444");
    redis.set("key5", "555");
    redis.set("key6", "666");

    // keys 的第二个参数是一个“插入迭代器”，我们需要创建一个保存结果的容器
    // 接下来再创建一个插入迭代器指向容器的位置，就可以将 keys 获取到的结果依次通过插入迭代器插入到容器指定位置中
    std::vector<string> result;
    auto it = std::back_inserter(result);
    redis.keys("*", it);
    printContainer(result);
}

//expire ttl
void test5(sw::redis::Redis& redis)
{
    cout << "expire 和 ttl 的使用" << endl;
    //清空一下数据库，避免之前残留的数据有干扰
    redis.flushall();
    redis.set("key1", "111");
    // redis.expire("key1", 10);
    bool ret = redis.expire("key1", std::chrono::seconds(10));
    std::this_thread::sleep_for(std::chrono::seconds(2));
    long long time = redis.ttl("key1");
    std::cout << time << std::endl;

}
//type
void test6(sw::redis::Redis& redis)
{
    cout << "type 的使用" << endl;
    //清空一下数据库，避免之前残留的数据有干扰
    redis.flushall();
    redis.set("key1", "111");
    string result = redis.type("key1");
    std::cout << result << std::endl;

    redis.lpush("key2", "222");
    string result_l = redis.type("key2");
    std::cout << result_l << std::endl;

    redis.hset("key3", "aaa", "111");
    string result_h = redis.type("key3");
    std::cout << result_h << std::endl;
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    // test5(redis);
    test6(redis);


}